// Copyright 2011 Jefferson Willian
// willmont7@gmail.com

#include <cstdio>
#include <set>
#include <utility>

#define MAX 50
#define INF 100000

using std::set;
using std::pair;

/* dist   -> ponteiro da matriz que retorna o menor custo para 'x'                   */
/* x      -> vertice que se deseja processar o menor custo(de todos para ele)        */
void dijkstra(int matrizAdj[][MAX], int dist[], int n, int x = 0) {
  int i, j;
  pair<int, int> node;                   // node.first -> custo; node.second -> vertice
  set< pair<int, int> > processQueue;    // Fila de prioridades para o processo
  set< pair<int, int> >::iterator it;

  /* Incializa a matriz de distancia e a fila de processos */
  for (i = 0;i < n;i++) {
    dist[i] = matrizAdj[i][x];
    node.first  = dist[i];
    node.second = i;
    processQueue.insert(node);
  }

  /* Processa todos os pontos do grafo */
  while (!processQueue.empty()) {
    /* Pega o ponto de menor custo que nao foi computado */
    x = processQueue.begin()->second;
    processQueue.erase(processQueue.begin());

    /* Atualiza o melhor custo dos outros pontos passando pelo ponto 'x' */
    for (it = processQueue.begin(); it != processQueue.end(); it++) {
      i = it->second;
      /* Se existe um melhor custo entao insere o ponto com o seu novo custo na fila de processos */
      if (matrizAdj[i][x] + dist[x] < dist[i]) {
        dist[i] = matrizAdj[i][x] + dist[x];
        processQueue.erase(it);
        node.first  = dist[i];
        node.second = i;
        processQueue.insert(node);
      }
    }
  }
}

int main() {
  int matriz[MAX][MAX];
  int dist[MAX];
  int city;
  int roads;
  int initCity;
  int n;
  int from, to;
  int games = 1;

  while (scanf("%d%d%d%d", &city, &roads, &initCity, &n) && (city !=0 || roads != 0 || initCity != 0 || n != 0)) {
    for (int i = 0;i < city;i++) {
      for (int j = 0;j < city;j++)
        matriz[i][j] = INF;
      matriz[i][i] = 0;
    }

    for (int i = 0;i < roads;i++) {
      scanf("%d", &from);
      scanf("%d", &to);

      matriz[from-1][to-1] = 1;
      matriz[to-1][from-1] = 1;
    }

    dijkstra(matriz, dist, city, initCity-1);

    printf("Teste %d\n", games++);

    for (int i = 0;i < city;i++)
      if (dist[i] <= n && dist[i] > 0)
        printf("%d ", i+1);

    printf("\n\n");
  }

  return 0;
}
